using UnityEngine.UI;

public class TestView : BaseView<TestViewModel>
{
    public Text text;
    public InputField inputField;

    TestViewModel vm;

    public override TestViewModel GetViewModel()
    {
        if (vm == null) vm = new TestViewModel("abcdefg");
        return vm;
    }

    protected override void OnBind(BindContext<TestViewModel> context)
    {
        context.Bind<Text>(text).For(t => t.text).To(vm => vm.Text).OneWay();
        context.Bind<InputField>(inputField).For(t => t.text).To(vm => vm.Text).TwoWay();
        context.Build();
    }
}

/*

    View 创建绑定上下文BindContext，并创建该视图的VM与上下文绑定
    BindContext持有VM，创建绑定构建列表IBuild
    View 在OnBind中进行绑定，调用BindContext:Bind()获取一个BindBuilder对象
    使用BindBuilder对象的For绑定视图组件的一个字段，方法内部会缓存该委托并通过Expression获取该字段或属性的Name
    使用To绑定VM的一个字段，方法内部同For一样会缓存该委托并通过Expression获取该字段或属性的Name
    在OnBind中绑定完所有的内容后，调用BindContext的Build对绑定进行构建
    Build中会便利IBuild绑定构建器列表，调用其中的Build方法
    内部会根据传入的绑定类型是OneWay或者是TwoWay来决定绑定的方法，OneWay会绑定VM到View层，TwoWay同时还会绑定View到VM层
    绑定VM到View层：VM中的属性发生改变后会通过Set方法对字段进行赋值，Set同时会调用一个event将新值和该属性的Name抛出
    此绑定就是关联这个event，当抛来的Name和自身To中缓存的Name相同时，通过Target和For中缓存的Name，使用反射找到对应视图层组件的属性或字段并赋值
    绑定View到VM层：判断传入的Target，将其视图组件的改变回调或事件进行注册，在改变后通过VM和To中缓存的Name反射找到对应的属性并赋值

*/
